package com.open.lock.annotation;


import com.open.lock.enums.LockModel;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static com.open.lock.enums.LockModel.REENTRANT;

/**
 * @author zhang kaichao
 */
@Inherited
@Target(ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Idempotent {

    /**
     * 使用spring el表达式 用#来引用方法参数
     */
    String[] keys() default {};

    /**
     * 锁的模式
     */
    LockModel lockModel() default REENTRANT;

    /**
     * 有效期(单位：毫秒) 默认：-1 有效期要大于程序执行时间，否则请求还是可能会进来
     * 有效期大于0，可以设置是否手动释放锁
     */
    long expire() default -1;

    /**
     * 提示信息，可自定义
     */
    String info() default "重复请求，请稍后重试";

    /**
     * 手动释放锁，如果设置了expireTime，会自动释放
     */
    boolean unlock() default false;
}
